[−][src]Crate smol
A small and fast async runtime.
Executors
There are three executors that poll futures:
- Thread-local executor for tasks created by
Task::local()
. - Work-stealing executor for tasks created by
Task::spawn()
. - Blocking executor for tasks created by
Task::blocking()
,blocking!
,iter()
,reader()
andwriter()
.
Blocking executor is the only one that spawns threads on its own.
See here for how to run executors on a single thread or on a thread pool.
Reactor
To wait for the next I/O event, the reactor calls epoll on Linux/Android, kqueue on macOS/iOS/BSD, and wepoll on Windows.
The Async
type registers I/O handles in the reactor and is able to convert their blocking
operations into async operations.
The Timer
type registers timers in the reactor that will fire at the chosen points in
time.
Running
Function run()
simultaneously runs the thread-local executor, runs the work-stealing
executor, and polls the reactor for I/O events and timers. At least one thread has to be
calling run()
in order for futures waiting on I/O and timers to get notified.
If you want a multithreaded runtime, just call run()
from multiple threads. See
here for an example.
There is also block_on()
, which blocks the current thread until a future completes, but it
doesn't poll the reactor or run executors. When using block_on()
, make sure at least one
thread is calling run()
, or else I/O and timers will not work!
Blocking tasks run in the background on a dedicated thread pool.
Examples
Connect to a HTTP website, make a GET request, and pipe the response to the standard output:
use futures::prelude::*; use smol::Async; use std::net::TcpStream; fn main() -> std::io::Result<()> { smol::run(async { let mut stream = Async::<TcpStream>::connect("example.com:80").await?; let req = b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"; stream.write_all(req).await?; let mut stdout = smol::writer(std::io::stdout()); futures::io::copy(&stream, &mut stdout).await?; Ok(()) }) }
Look inside the examples directory for more: a web crawler, a Ctrl-C handler, a TCP client/server, a TCP chat client/server, a TLS client/server, an HTTP+TLS client/server, an async-h1 client/server, a hyper client/server, and a WebSocket+TLS client/server.
It's also possible to plug non-async libraries into the runtime: see inotify, timerfd, signal-hook, and uds_windows.
Finally, there's an example showing how to use smol with async-std, tokio, surf, and reqwest.
Macros
blocking | Spawns blocking code onto a thread. |
Structs
Async | Async I/O. |
Task | A spawned future. |
Timer | Fires at the chosen point in time. |
Functions
block_on | Blocks on a single future. |
iter | Creates a stream that iterates on a thread. |
reader | Creates an async reader that runs on a thread. |
run | Runs executors and polls the reactor. |
writer | Creates an async writer that runs on a thread. |